\chapter{Лекция 1. Введение}

\section{Введение и обзор курса}

\subsection{О лекторе}

Андрей Толмачев email: andrey.tolmachev@gmail.com

\subsection{Список литературы}

К следующему разу обещал приготовить. Советовал почитать книгу Станислав Лем "Сумма технологий".

\subsection{Введение}

В рамках курса Software Disign мы будем говорить о не технологических навыках разработки ПО.

\paragraph{Классификация систем}

\begin{itemize}
\item Simple - простые системы, использование и сборка которых не требует специальных знаний

\item Complicated - усложненные системы, имеют некоторый порог вхождения, потребуется некоторое время, чтобы понять как собрать эту систему и как ее использовать
(т. е. система которая ведет себя детерминировано, но из-за большого размера требуется время для получения навыков работы с ними)

\item Complex - сложные системы, характеризуются характеризующиеся некоторой неопределенностью, т. е. постоянная работа дает некоторые знания о системе, но не
гарантирует ускорение работы

\item Chaos - системы, в которых практически отсутствует определенность
\end{itemize}

Как применить это к программным продуктам? Как правило, программные системы принадлежат одному из первых трех классов, а интересными для нас системами будут
системы класса Complex, так как ПО постоянно развивается, появляются новые требования, а следовательно достаточно большие проекты обладают некоторой степенью
недетерминированности своего развития.

Как бороться с этой недетерминированностью? Можно пытаться угадывать возможные будущие требования, но это негибкое и непредсказуемое решение, гораздо большими
приемуществами обладают гибкие и конфигурируемые системы, в которых для добавления новых фич требуется дописать небольшой объем кода, как создавать такие
системы мы и постараемся узнать на этих занятиях.

\paragraph{Что мы будем изучать в курсе}

В курсе будет рассматрваться проектирование программных систем с использованием ООП парадигмы. ПО будет рассматриваться на разных уровнях:

\begin{itemize}
\item На уровне интерфейсов классов (рассмотрим основные концепции ООП)

\item На уровне взаимодействия объектов (рассмотрим паттерны)

\item На уровне компонентов и модулей программной системы (рассмотрим принцип модульной организации ПО)
\end{itemize}

Чтобы разговаривать на одном языке и понимать друг друга будем использовать UML. UML позволяет очень лаконично обмениваться идеями, кроме того в графической
форме выражать свои мысли, как правило, получается нагляднее.

Кроме того в курсе мы рассмотрим TDD, так как тестирование одна из важных составляющих разработки ПО, а кроме того возможность достаточно просто писать тесты для
разработанной системы показывает качество ее архитекутры, т. е. через тесты имеем критерий оценки качества некоторого решения.

\paragraph{Уровни мастерства}

Существует несколько различных описаний уровня владения теми или иными навыками, например, в одном из восточных единоборств есть такое разделение по уровням:

\begin{itemize}
\item Shu - освоение конкретной техники и следование определенному набору правил (learn the rule)

\item Ha - освоение дополнительных техник и навыков к уже освоенной базовой технике, некоторое отхождение от изученных правил с учетом новых знаний (break the
rule)

\item Ri - комбинирование нескольких известных техник и знаний для получения новых правил и знаний (be the rule)
\end{itemize}

\paragraph{Составляющие качества}

\begin{enumerate}
\item Правильность работы программы

\item Читаемость и простота кода

\item Архитектура

\item Переиспользуемость кода

\item Модульность

\item Unit тесты

\item Структура проекта
\end{enumerate}

\section{Домашнее задание}

Проект браузера